package pf;
import basic.*;

import java.io.IOException;

/*
 * La classe PF_Manager permet d'effectuer des operation de bas niveau sur des fichiers pagines.
 * Elle permet ainsi de:
 * 1) Creer un fichier en recevant comme parametre le nom du fichier a creer
 * 2) supprimer un fichier en recevant en parametre le nom du fichier a supprimer
 * 3) D'ouvrir un fichier en recevant en parametre le nom du fichier a ouvrir
 * 4) De fermer un fichier en recevant en parametre une reference sur un objet de type PF_FileHandle
 *  	precedement initialisee lors de la creation ou de l'ouverture du fichier
 * 5) D'allouer un block (une page) a un fichier
 * 6) De desallouer des block a un fichier en recevant en paramettre une reference sur un objet de type buffer
 * 		precedement initialisee lors de l'allocation de page.
 */
public interface PF_Manager_Interface {

	/*
	 * Cette methode permet de creer un fichier pagine.
	 * Un fichier portant ce nom ne devrait pas deja exister
	 * Params: 	String filename: Le nom du fichier a creer
	 * Retour:	Retoune une reference sur un objet de type PF_FileHandle 
	 */
	public ReturnCode CreateFile(String filename) throws IOException;

	/*
	 * Cette methode permet de supprimer un fichier pagine.
	 * Un fichier portant ce nom devrait deja exister
	 * Params: 	String filename: Le nom du fichier a supprimer
	 * Retour:
	 */
	public ReturnCode DestroyFile(String filename);


	/*
	 * Cette methode permet dd'ouvrire un fichier.
	 * Un fichier portant ce nom devrait deja exister et devrait avoir ete cree par la methode CreateFile().
	 * Une fichier peut etre ouvert plusiers fois en utilisant des objets fileHandle differents.
	 * Params: 	String filename: Le nom du fichier a ouvrire
	 * Retour:	Retoune une reference sur un objet de type PF_FileHandle 
	 */
	public ReturnCode OpenFile(String filename, PF_FileHandle fileHandle) throws IOException;


	/*
	 * Cette methode permet de fermer un fichier.
	 * Le fichier devrait avoir ete precedement ouvert par la methode OpenFile
	 * Params: 	PF_FileHandle fileHandle: Une intance d'un objet de type fileHandle.
	 * Retour:
	 */
	public ReturnCode CloseFile(PF_FileHandle fileHandle);

	/*
	 * This method allocates a "scratch" memory page(block) in the buffer pool,
	 * and sets buffer to point to it.
	 * The scratch page is automatically pinned in the buffer pool.
	 * It is often called by PF_FileHandle.AllocatePage()
	 */

	/*
	 * Cette methode permet d'allouer une page en memoir dans le buffer pool 
	 * et faire pointer le buffer sur cette page.
	 * La page nouvellement allouee devrait etre "Pinned" automatiquement.
	 * Params: 	Buffer buf: Une reference sur un objet de type Buffer.
	 * Retour:
	 */
	public ReturnCode AllocateBlock(byte[] buffer);

	/*
	 * This method disposes of the scratch page in the buffer pool pointed to by buffer,
	 * which must have been allocated previously by PF_Manager::AllocateBlock.
	 * Similar to pinning and unpinning,
	 * one must call PF_Manager::DisposeBlock for each buffer block
	 * obtained by calling PF_Manager::AllocateBlock;
	 * otherwise one will lose pages in the buffer pool permanently.
	 */

	/*
	 * Cette methode permet de supprimer une page en memoir dans le buffer pool.
	 * Cette page devrait avoir ete precedement allouee par la methode AllocateBlock().
	 * La page ainsi deallouee devrait etre "Unpinned" automatiquement.
	 * Params: 	Buffer buf: Un objet de type Buffer.
	 * Retour:
	 */
	public ReturnCode DisposeBlock(byte[] buffer);


	//
	// ClearBuffer
	//
	// Desc: Remove all entries from the buffer manager.
	//	       This routine will be called via the system command and is only
	//	       really useful if the user wants to run some performance
	//	       comparison starting with an clean buffer.
	// In:   Nothing
	// Out:  Nothing
	// Ret:  Returns the result of PF_BufferMgr::ClearBuffer
	//	       It is a code: 0 for success, something else for a PF error.
	//
	public ReturnCode ClearBuffer();

	//
	// PrintBuffer
	//
	// Desc: Display all of the pages within the buffer.
	//	       This routine will be called via the system command.
	// In:   Nothing
	// Out:  Nothing
	// Ret:  Returns the result of PF_BufferMgr::PrintBuffer
	//	       It is a code: 0 for success, something else for a PF error.
	//
	public ReturnCode PrintBuffer();

	//
	// ResizeBuffer
	//
	// Desc: Resizes the buffer manager to the size passed in.
	//	       This routine will be called via the system command.
	// In:   The new buffer size
	// Out:  Nothing
	// Ret:  Returns the result of PF_BufferMgr::ResizeBuffer
	//	       It is a code: 0 for success, PF_TOOSMALL when iNewSize
	//	       would be too small.
	//
	public ReturnCode ResizeBuffer(int iNewSize);

	//------------------------------------------------------------------------------
	// Three Methods for manipulating raw memory buffers.  These memory
	// locations are handled by the buffer manager, but are not
	// associated with a particular file.  These should be used if you
	// want memory that is bounded by the size of the buffer pool.
	//
	// The PF_Manager just passes the calls down to the Buffer manager.
	//------------------------------------------------------------------------------

	public ReturnCode GetBlockSize(int length);

}
